/**
 * 给定数组A，给定K属于{0, 1}
 * 问恰好K次交换以后，A的最大子段和是多少
 * N在1000
 * 首先求出前缀和，然后枚举每一个子段和，
 * 在条件允许的情况下试着交换前后位置，检查值即可
 * O(N^2)
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;

int N;
int K;
vector<llt> A;

llt proc(){
    static llt INF = 0x7F8F9FAFBFCFDFEF;

    vector<llt> S(N + 1, 0);
    for(int i=1;i<=N;++i) S[i] = S[i - 1] + A[i];

    llt ans = -INF;
    for(int i=1;i<=N;++i){
        for(int j=i;j<=N;++j){
            llt tmp = S[j] - S[i - 1];
            ans = max(ans, tmp);
            if(1 == K){
                if(i - 2 >= 1){
                    ans = max(ans, tmp + A[i - 2]);
                }         
                if(j + 2 <= N){
                    ans = max(ans, tmp + A[j + 2]);
                }                
            }

        }
    }
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> N >> K;
        A.assign(N + 1, {});
        for(int i=1;i<=N;++i) cin >> A[i];
        cout << proc() << "\n";        
    }
    return 0;
}